home *** CD-ROM | disk | FTP | other *** search
/ OpenGL Superbible (2nd Edition) / OpenGL SuperBible e2.iso / tools / GLUT-3.7 / LIB / GLSMAP / smap_buildsmap.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-12  |  6.2 KB  |  228 lines

  1.  
  2. /* Copyright (c) Mark J. Kilgard, 1998.  */
  3.  
  4. /* This program is freely distributable without licensing fees
  5.    and is provided without guarantee or warrantee expressed or
  6.    implied. This program is -not- in the public domain. */
  7.  
  8. /* smap_buildsmap.c - automatically builds sphere map */
  9.  
  10. #include <assert.h>
  11. #include <stdio.h>
  12. #include <GL/glsmap.h>
  13. #include <GL/glu.h>
  14.  
  15. #include "glsmapint.h"
  16.  
  17. #if defined(GL_EXT_texture_object) && !defined(GL_VERSION_1_1)
  18. #define glBindTexture(A,B)     glBindTextureEXT(A,B)
  19. #endif
  20. #if defined(GL_EXT_copy_texture) && !defined(GL_VERSION_1_1)
  21. #define glCopyTexImage2D(A, B, C, D, E, F, G, H)    glCopyTexImage2DEXT(A, B, C, D, E, F, G, H)
  22. #endif
  23.  
  24. static void
  25. copyImageToTexture(SphereMap *smap,
  26.                    GLuint texobj, int origin[2], int texdim)
  27. {
  28.         int isSmapTexObj = (texobj == smap->smapTexObj) ? 1 : 0;
  29.         int genMipmapsFlag =
  30.                 isSmapTexObj ? SMAP_GENERATE_SMAP_MIPMAPS : SMAP_GENERATE_VIEW_MIPMAPS;
  31.         static GLubyte pixels[256][256][3];  /* XXX fix me. */
  32.  
  33.     glBindTexture(GL_TEXTURE_2D, texobj);
  34.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
  35.         GL_LINEAR);
  36.         if (smap->flags & genMipmapsFlag) {
  37.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  38.                         GL_LINEAR_MIPMAP_LINEAR);
  39.         } else {
  40.                 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
  41.                   GL_LINEAR);
  42.         }
  43.  
  44.         glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  45.     /* Clamp to avoid artifacts from wrap around in texture. */
  46.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  47.     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  48.  
  49.         if (smap->flags & genMipmapsFlag) {
  50.             glPixelStorei(GL_PACK_ALIGNMENT, 1);
  51.                 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  52.                 glReadPixels(origin[X], origin[Y], texdim, texdim,
  53.                         GL_RGB, GL_UNSIGNED_BYTE, pixels);
  54.                 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, texdim, texdim,
  55.                         GL_RGB, GL_UNSIGNED_BYTE, pixels);       
  56.         } else {
  57.                 glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
  58.                 origin[X], origin[Y], texdim, texdim, 0);
  59.         }
  60. }
  61.  
  62. static struct {
  63.     GLfloat angle;
  64.     GLfloat x, y, z;
  65. } faceInfo[6] = {
  66.     {   0.0, +1.0,  0.0,  0.0 },  /* front */
  67.     {  90.0, -1.0,  0.0,  0.0 },  /* top */
  68.     {  90.0, +1.0,  0.0,  0.0 },  /* bottom */
  69.     {  90.0,  0.0, -1.0,  0.0 },  /* left */
  70.     {  90.0,  0.0, +1.0,  0.0 },  /* right */
  71.     { 180.0, -1.0,  0.0,  0.0 }   /* back */
  72. };
  73.  
  74. static void
  75. configFace(SphereMap *smap, int view)
  76. {
  77.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  78.     glMatrixMode(GL_MODELVIEW);
  79.     glLoadIdentity();
  80.     glRotatef(faceInfo[view].angle,
  81.         faceInfo[view].x, faceInfo[view].y, faceInfo[view].z);
  82.     gluLookAt(smap->obj[X], smap->obj[Y], smap->obj[Z],  /* "eye" at object */
  83.               smap->eye[X], smap->eye[Y], smap->eye[Z],  /* looking at eye */
  84.               smap->up[X], smap->up[Y], smap->up[Z]);
  85. }
  86.  
  87. static void
  88. initGenViewTex(SphereMap *smap)
  89. {
  90.     glMatrixMode(GL_PROJECTION);
  91.     glLoadIdentity();
  92.     gluPerspective(90.0, 1.0, smap->viewNear, smap->viewFar);
  93.     glViewport(smap->viewOrigin[X], smap->viewOrigin[Y],
  94.         smap->viewTexDim, smap->viewTexDim);
  95.     glScissor(0, 0, smap->viewTexDim, smap->viewTexDim);
  96.     glEnable(GL_SCISSOR_TEST);
  97.     glEnable(GL_DEPTH_TEST);
  98. }
  99.  
  100. static void
  101. genViewTex(SphereMap *smap, int view)
  102. {
  103.     configFace(smap, view);
  104.         assert(smap->positionLights);
  105.     smap->positionLights(view, smap->context);
  106.         assert(smap->drawView);
  107.     smap->drawView(view, smap->context);
  108. }
  109.  
  110. void
  111. smapGenViewTex(SphereMap *smap, int view)
  112. {
  113.     initGenViewTex(smap);
  114.     genViewTex(smap, view);
  115.     copyImageToTexture(smap, smap->viewTexObjs[view],
  116.         smap->viewOrigin, smap->viewTexDim);
  117. }
  118.  
  119. void
  120. smapGenViewTexs(SphereMap *smap)
  121. {
  122.     int view;
  123.  
  124.     initGenViewTex(smap);
  125.  
  126.     for (view=0; view<6; view++) {
  127.         genViewTex(smap, view);
  128.         copyImageToTexture(smap, smap->viewTexObjs[view],
  129.             smap->viewOrigin, smap->viewTexDim);
  130.     }
  131. }
  132.  
  133. void
  134. drawSphereMapMesh(SphereMap *smap)
  135. {
  136.     int side;
  137.  
  138.     /* Calculate sphere map mesh if needed. */
  139.     __smapValidateSphereMapMesh(smap->mesh);
  140.  
  141.     /* Five front and side faces. */
  142.     for (side=0; side<5; side++) {
  143.         /* Bind to texture for given face of cube map. */
  144.         glBindTexture(GL_TEXTURE_2D, smap->viewTexObjs[side]);
  145.         __smapDrawSphereMapMeshSide(smap->mesh, side);
  146.     }
  147.  
  148.     /* Bind to texture for back face of cube map. */
  149.     glBindTexture(GL_TEXTURE_2D, smap->viewTexObjs[side]);
  150.     __smapDrawSphereMapMeshBack(smap->mesh);
  151. }
  152.  
  153. void
  154. initDrawSphereMapMesh(SphereMap *smap)
  155. {
  156.     glMatrixMode(GL_PROJECTION);
  157.     glLoadIdentity();
  158.     gluOrtho2D(0, 1, 0, 1);
  159.     glMatrixMode(GL_MODELVIEW);
  160.     glLoadIdentity();
  161.         glViewport(smap->smapOrigin[X], smap->smapOrigin[Y],
  162.         smap->smapTexDim, smap->smapTexDim);
  163.  
  164.         if (smap->flags & SMAP_CLEAR_SMAP_TEXTURE) {
  165.             glClear(GL_COLOR_BUFFER_BIT);
  166.         }
  167.  
  168.     glDisable(GL_DEPTH_TEST);
  169.     glEnable(GL_TEXTURE_2D);
  170.     glDisable(GL_CULL_FACE);
  171. }
  172.  
  173. void
  174. smapGenSphereMapFromViewTexs(SphereMap *smap)
  175. {
  176.     initDrawSphereMapMesh(smap);
  177.     drawSphereMapMesh(smap);
  178.  
  179.     copyImageToTexture(smap, smap->smapTexObj,
  180.         smap->smapOrigin, smap->smapTexDim);
  181. }
  182.  
  183. void
  184. smapGenSphereMap(SphereMap *smap)
  185. {
  186.     smapGenViewTexs(smap);
  187.     smapGenSphereMapFromViewTexs(smap);
  188. }
  189.  
  190. void
  191. smapGenSphereMapWithOneViewTex(SphereMap *smap)
  192. {
  193.     int side;
  194.  
  195.     /* Make sure viewports are not obviously overlapping. */
  196.     assert(smap->viewOrigin[X] != smap->smapOrigin[X]);
  197.     assert(smap->viewOrigin[Y] != smap->smapOrigin[Y]);
  198.  
  199.     /* Calculate sphere map mesh if needed. */
  200.     __smapValidateSphereMapMesh(smap->mesh);
  201.  
  202.     /* Five front and side faces. */
  203.     for (side=0; side<5; side++) {
  204.         initGenViewTex(smap);
  205.         genViewTex(smap, side);
  206.         copyImageToTexture(smap, smap->viewTexObj,
  207.             smap->viewOrigin, smap->viewTexDim);
  208.  
  209.         /* Preceeding copyImageToTexture does bind to smap->viewTexObj */
  210.  
  211.         initDrawSphereMapMesh(smap);
  212.         __smapDrawSphereMapMeshSide(smap->mesh, side);
  213.     }
  214.  
  215.     initGenViewTex(smap);
  216.     genViewTex(smap, SMAP_BACK);
  217.     copyImageToTexture(smap, smap->viewTexObj,
  218.             smap->viewOrigin, smap->viewTexDim);
  219.  
  220.     /* Preceeding copyImageToTexture does bind to smap->viewTexObj */
  221.  
  222.     initDrawSphereMapMesh(smap);
  223.     __smapDrawSphereMapMeshBack(smap->mesh);
  224.  
  225.     copyImageToTexture(smap, smap->smapTexObj,
  226.         smap->smapOrigin, smap->smapTexDim);
  227. }
  228.